import pandas as pd
import io

# 1. 加载数据
# 在实际使用中，您应该使用 pd.read_excel("您的文件名.xlsx") 来读取Excel文件。
# 这里为了演示，我们直接将您提供的数据加载进来。

df = pd.read_excel("预处理3——孕周数（小数）.xlsx")

# 2. 筛选出每个孕妇第一次检测的数据作为基准
# 注意：对于A003这种有多条“第一次”记录的情况，我们只取其中第一条出现的记录
baseline_df = df[df['检测抽血次数'] == 1].drop_duplicates(subset=['孕妇代码'], keep='first')

# 3. 提取基准BMI并建立 "孕妇代码" -> "基准BMI" 的映射
baseline_bmi_map = baseline_df.set_index('孕妇代码')['孕妇BMI']

# 4. 计算所有基准BMI的最大值和最小值，用于归一化
min_bmi = baseline_bmi_map.min()
max_bmi = baseline_bmi_map.max()

# 5. 定义归一化函数
def normalize(bmi):
    # 防止分母为0的情况
    if (max_bmi - min_bmi) == 0:
        return 0.5
    return (bmi - min_bmi) / (max_bmi - min_bmi)

# 6. 对基准BMI进行归一化处理
normalized_baseline_bmi_map = baseline_bmi_map.apply(normalize)

# 7. 将归一化后的基准BMI映射回原始DataFrame，生成新的一列
# 新列的名称可以自定义，这里我们命名为 "归一化基准BMI"
df['归一化基准BMI'] = df['孕妇代码'].map(normalized_baseline_bmi_map)
df['基准BMI'] = df['孕妇代码'].map(baseline_bmi_map)
# 8. 显示处理后的结果（展示部分列和新列）
# 在实际操作中，您可能希望将结果保存到新的Excel文件
print("处理完成，以下为部分结果预览：")
print(df[['孕妇代码', '检测抽血次数', '孕妇BMI', '归一化基准BMI','基准BMI']].head(15))

# 9. (可选) 保存到新的Excel文件
# 如果需要将带有新列的完整表格保存，请取消下面这行代码的注释
df.to_excel("data_after_process_2.xlsx", index=False, engine='openpyxl')
# print("\n已成功将结果保存到 '处理后的孕妇数据.xlsx'")